package ch04;public class Rational {
	int numerator = 1;				//分子
	int denominator = 1;				//分母
	void setNumerator(int a) {			//设置分子
		int c=f(Math.abs(a),denominator);	//计算最大公约数
		numerator = a/c;
		denominator = denominator/c;
		if(numerator<0&&denominator<0) {
			numerator = -numerator;
			denominator = -denominator;
		}
	}
	void setDenominator(int b) {			//设置分母
		int c=f(numerator,Math.abs(b));		//计算最大公约数
		numerator = numerator/c;
		denominator = b/c;
		if(numerator<0&&denominator<0) {
			numerator = -numerator;
			denominator = -denominator;
		}
	}
	int getNumerator() {
		return numerator;
	}
	int getDenominator() {
		return denominator;
	}
	int f(int a,int b) { 				//求a,b的最大公约数
		if(a==0) return 1;
		if(a<b) {
			int c=a;
			a = b;
			b = c;
		}
		int r=a%b;
		while(r!=0) {
			a=b;
			b=r;
			r=a%b;
		}
		return b;
	}
	Rational add(Rational r) {			//加法运算
		int a = r.getNumerator();		//返回有理数r的分子
		int b = r.getDenominator();		//返回有理数r的分母
		int newNumerator = numerator*b+denominator*a;	//计算新分子
		int newDenominator = denominator*b;		//计算新分母
		Rational result = new Rational();
		result.setNumerator(newNumerator);
		result.setDenominator(newDenominator);
		return result;
	}
	Rational sub(Rational r) {			//减法运算
		int a = r.getNumerator();
		int b = r.getDenominator();
		int newNumerator = numerator*b-denominator*a;
		int newDenominator = denominator*b;
		Rational result = new Rational();
		result.setNumerator(newNumerator);
		result.setDenominator(newDenominator);
		return result;
	}
	Rational multi(Rational r) {			//乘法运算
		int a = r.getNumerator();
		int b = r.getDenominator();
		int newNumerator = numerator*a;
		int newDenominator = denominator*b;
		Rational result = new Rational();
		result.setNumerator(newNumerator);
		result.setDenominator(newDenominator);
		return result;
	}
	Rational div(Rational r) {			//除法运算
		int a = r.getNumerator();
		int b = r.getDenominator();
		int newNumerator = numerator*b;
		int newDenominator = denominator*a;
		Rational result = new Rational();
		result.setNumerator(newNumerator);
		result.setDenominator(newDenominator);
		return result;
	}
}
